﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace KaartSpel
{
    public class FormController
    {

        private Game game;
        private String playerCard, computerCard;
        private int playerScore, computerScore;
        private bool myMove, zetGewonnen;
        private KaartenLib.Types troef;

        private int inzetPunten, inzetAantal;
        private int totaalPunten, totaalAantal, totaalPCPunten, totaalPCAantal;
        public int punten;

        private GameScherm form;
        TroefVenster t;

        private ComputerAI computerAI;

        public FormController(String naam, int punten)
        {
            computerAI = new SillyComputerAI();
            myMove = true;
            playerScore = 0; computerScore = 0;
            totaalPCAantal = 0;
            totaalPCPunten = 0;
            totaalAantal = 0;
            totaalPunten = 0;
            this.punten = punten;
            game = new Game(naam, this.punten);

            t = new TroefVenster(this);
            t.Visible = true;
        }

        public Boolean evalueerInzet(int punten, int aantal)
        {
            bool terug = false;
            if ((2 * (aantal + punten)) <= game.Score)
            {
                terug = true;
            }
            return terug;
        }

        public void Scherm_Load(object sender, EventArgs e)
        {
            
        }

        public void playerListView_MouseDown(Object sender, MouseEventArgs e)
        {
            if (myMove && e.Button == MouseButtons.Left && e.Clicks == 1)
            {
                myMove = false;
                
                ListViewHitTestInfo htInfo = form.playerListView.HitTest(e.X, e.Y);
                int index = htInfo.Item.Index;
                ListViewItem item = htInfo.Item;

                KaartenLib.Kaart k = game.player_me.kaarten[index];

                game.player_me.kaarten.Remove(k);
                form.playerListView.Items.Remove(item);
                form.battleListView.Items.Add(item);
                playerScore = BerekenScore(k);
                playerCard = FormatCardToString(k, playerScore);

                if (computerScore == 0) // computer heeft al gespeeld
                {
                    DoeZet();
                }
                form.delayTimer.Start();
                //EvalueerZet();
            }
        }

        private int getKaartIndex(KaartenLib.Kaart Kaart)
        {
            int type;
            if (Kaart.Zichtbaar)
            {
                if (Kaart.Type.Equals(KaartenLib.Types.Harten))
                {
                    type = 0;
                }
                else if (Kaart.Type.Equals(KaartenLib.Types.Klaveren))
                {
                    type = 1;
                }
                else if (Kaart.Type.Equals(KaartenLib.Types.Ruiten))
                {
                    type = 2;
                }
                else
                {
                    type = 3;
                }
                type = 13 * type + (int)((KaartenLib.Waarden)Enum.Parse(typeof(KaartenLib.Waarden), Kaart.Waarde.ToString())) - 1;
            }
            else
            {
                type = 52;
            }
            return type;
        }

        private void DoeZet()
        {
            int index = computerAI.getKaartIndex(playerScore, game.player_computer.kaarten);
            KaartenLib.Kaart k = game.player_computer.kaarten.ElementAt(index);
            k.Zichtbaar = true;
            ListViewItem i = new ListViewItem();
            i.ImageIndex = getKaartIndex(k);
            form.computerListView.Items.RemoveAt(index);
            form.battleListView.Items.Add(i);
            game.player_computer.kaarten.Remove(k);
            computerScore = BerekenScore(k);
            computerCard = FormatCardToString(k, computerScore);
        }

        private void KomUit()
        {
            int index = computerAI.getKaartIndex(playerScore, game.player_computer.kaarten);
            KaartenLib.Kaart k = game.player_computer.kaarten.ElementAt(index);
            k.Zichtbaar = true;
            ListViewItem i = new ListViewItem();
            i.ImageIndex = getKaartIndex(k);
            form.computerListView.Items.RemoveAt(index);
            form.battleListView.Items.Add(i);
            game.player_computer.kaarten.Remove(k);
            computerScore = BerekenScore(k);
            computerCard = FormatCardToString(k, computerScore);
        }

        private String FormatCardToString(KaartenLib.Kaart k, int playerScore)
        {
            return k.ToString() + " (" + playerScore + ")";
        }

        public void TimerTick()
        {
            EvalueerZet();
        }

        private void EvalueerZet()
        {
            if (playerScore > computerScore)
            {
                form.logListBox.Items.Add(playerCard + " -  " + computerCard + " [GEWONNEN]");
                totaalPunten += playerScore + computerScore;
                totaalAantal += 2;
                playerScore = 0; computerScore = 0;
                zetGewonnen = true;
            }
            else
            {
                form.logListBox.Items.Add(playerCard + " -  " + computerCard + " [verloren]");
                totaalPCPunten += playerScore + computerScore;
                totaalPCAantal += 2;
                playerScore = 0; computerScore = 0;
                zetGewonnen = false;
            }
            form.battleListView.Items.Clear();
            if (game.player_me.kaarten.Count == 0 || game.player_computer.kaarten.Count == 0)
            {
                form.testLabel.Text = "";
                if (inzetAantal > 0)
                {
                    int winst = 0;
                    if (totaalAantal > totaalPCAantal) //gewonnen
                    {
                        winst = 2 * inzetAantal;
                    }
                    else // verloren
                    {
                        winst = -2 * inzetAantal;
                    }
                    game.Score += winst;
                    form.testLabel.Text += " Punten: " + winst;
                }
                if (inzetPunten > 0)
                {
                    int winst2 = 0;
                    if (totaalPunten > totaalPCPunten) //gewonnen
                    {
                         winst2 = 2 * inzetPunten;
                    }
                    else // verloren
                    {
                        winst2 = -2 * inzetPunten;
                    }
                    form.testLabel.Text += " Aantal: " + winst2;
                }
                //form.testLabel.Text += " SCORE: " + game.Score;
                //einde
            }
            else
            {
                if (!zetGewonnen)
                {
                    KomUit();
                }
                myMove = true;
            }
        }

        private int BerekenScore(KaartenLib.Kaart k)
        {
            int score;
            score = (int)k.Waarde;//(int)((KaartenLib.Waarden)Enum.Parse(typeof(KaartenLib.Waarden), k.Waarde.ToString()));
            if (score == 1)
            {
                score = 20;
            }
            if (k.Type.Equals(troef))
            {
                score *= 2;
            }
            return score;
        }

        public void startSpel(int punten, int aantal, String troef)
        {
            t.Visible = false;
            InitForm();
            inzetPunten = punten;
            inzetAantal = aantal;
            this.troef = (KaartenLib.Types) Enum.Parse(typeof(KaartenLib.Types), troef, true);
            form.Visible = true;
        }

        private void InitForm()
        {
            form = new GameScherm(this);
            form.battleListView.LargeImageList = form.cardImageList;

            form.computerListView.LargeImageList = form.cardImageList;
            for (int i = 0; i < game.player_computer.kaarten.Count; i++)
            {
                ListViewItem item = new ListViewItem();
                item.ImageKey = Convert.ToString(i);
                item.ImageIndex = getKaartIndex(game.player_computer.kaarten[i]);
                form.computerListView.Items.Add(item);
            }

            form.playerListView.LargeImageList = form.cardImageList;
            for (int i = 0; i < game.player_me.kaarten.Count; i++)
            {
                game.player_me.kaarten[i].Zichtbaar = true;
                ListViewItem item = new ListViewItem();
                item.ImageKey = Convert.ToString(i);
                item.ImageIndex = getKaartIndex(game.player_me.kaarten[i]);
                form.playerListView.Items.Add(item);
            }
        }
    }
}
